package com.niit.covid.TopOne;


import com.niit.covid.bean.CovidBean;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * @author:Ys
 * @date: 2022年08月12日 16:01
 * @desc:
 * 需求：找出美国疫情数据中，每个州state的确诊案例数最多的县county是哪一个。该问题也是俗称的TopN问题。
 * 分析：
 *  自定义对象，在map阶段将“州state和累计确诊病例数cases”作为key输出，重写对象的排序规则，首先根据州的正序排序，如果州相等，按照确诊病例数cases倒序排序，发送到reduce。
 *  在reduce端利用自定义分组规则，将州state相同的分为一组，然后取第一个即是最大值。
 */
public class CovidTopOneMapper extends Mapper<LongWritable, Text, CovidBean, NullWritable> {

    CovidBean outKey = new CovidBean();
    NullWritable outValue = NullWritable.get();

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] fields = value.toString().split(",");
        //封装数据： 州 县 确诊病例
        String state = fields[2];
        String country = fields[1];
        long cases = Long.parseLong( fields[3] );

        outKey.set(state,country,cases);

        context.write(outKey,outValue);
    }

}
